package com.luocx.weixinproject.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.luocx.weixinproject.util.Const;
import com.luocx.weixinproject.util.HttpsUtil;
import com.luocx.weixinproject.util.WeixinUserInfoUtil;

@Controller
public class ProcessController {
	
	private static Logger logger = LoggerFactory.getLogger(ProcessController.class);

	/**
	 * 新建UserInfoUtil，得到一个URL，这个URL是让用户去访问的，当用户进入该URL后，如果用户同意授权，
	 * 微信服务器收到请求，页面将跳转至 redirect_uri/?code=CODE&state=STATE，
	 * 也就是你的外网访问网址，携带两个参数，一个为code，一个为state
	 * 
	 * 网页授权机制，开发者文档写的很详细，一共五个步骤： 1 ：用户同意授权，获取code 2 ：通过code换取网页授权access_token
	 * 3：刷新access_token（如果需要） 4 ：拉取用户信息(需scope为 snsapi_userinfo)
	 * 5附：检验授权凭证（access_token）是否有效
	 * 
	 * 在这里，我们只需要三个步骤就可以了，即： 1 ：用户同意授权，获取code 2 ：通过code换取网页授权access_token
	 * 3：拉取用户信息(需scope为 snsapi_userinfo)
	 * 
	 * @param code
	 * @param state
	 * @return
	 */
	// required=false的意思就是可以不传此参数
	@RequestMapping("/index")
	public ModelAndView listVote(@RequestParam(name = "code", required = false) String code,
			@RequestParam(name = "state") String state) {

		System.out.println("-----------------------------收到请求，请求数据为：" + code + "-----------------------" + state);

		// 通过code换取网页授权web_access_token
		if (code != null || !(code.equals(""))) {

			String APPID = Const.appId;
			String SECRET = Const.appSecret;
			String CODE = code;
			String WebAccessToken = "";
			String openId = "";
			String nickName, sex, openid = "";
			String REDIRECT_URI = "https://qiangqiangchen.55555.io/vote.do";
			String SCOPE = "snsapi_userinfo";

			String getCodeUrl = WeixinUserInfoUtil.getCode(APPID, REDIRECT_URI, SCOPE);
			System.out.println("---------------getCodeUrl--------------" + getCodeUrl);

			// 替换字符串，获得请求URL
			String token = WeixinUserInfoUtil.getWebAccess(APPID, SECRET, CODE);
			System.out.println("----------------------------token为：" + token);
			// 通过https方式请求获得web_access_token
			String response = HttpsUtil.httpsRequestToString(token, "GET", null);
			JSONObject jsonObject = JSON.parseObject(response);
			System.out.println("jsonObject------" + jsonObject);
			if (null != jsonObject) {
				try {
					WebAccessToken = jsonObject.getString("access_token");
					openId = jsonObject.getString("openid");
					System.out.println(
							"获取access_token成功-------------------------" + WebAccessToken + "----------------" + openId);

					// -----------------------拉取用户信息...替换字符串，获得请求URL
					String userMessage = WeixinUserInfoUtil.getUserMessage(WebAccessToken, openId);
					System.out.println(" userMessage===" + userMessage);
					// 通过https方式请求获得用户信息响应
					String userMessageResponse = HttpsUtil.httpsRequestToString(userMessage, "GET", null);

					JSONObject userMessageJsonObject = JSON.parseObject(userMessageResponse);

					System.out.println("userMessagejsonObject------" + userMessageJsonObject);

					if (userMessageJsonObject != null) {
						try {
							// 用户昵称
							nickName = userMessageJsonObject.getString("nickname");
							// 用户性别
							sex = userMessageJsonObject.getString("sex");
							sex = (sex.equals("1")) ? "男" : "女";
							// 用户唯一标识
							openid = userMessageJsonObject.getString("openid");

							System.out.println("用户昵称------------------------" + nickName);
							System.out.println("用户性别------------------------" + sex);
							System.out.println("用户的唯一标识-------------------" + openid);
						} catch (JSONException e) {
							System.out.println("获取userName失败");
						}
					}

				} catch (JSONException e) {
					WebAccessToken = null;// 获取code失败
					System.out.println("获取WebAccessToken失败");
				}

			}
		}
		// 此处业务代码
		//TODO
		return new ModelAndView("index");

	}
	
	@RequestMapping("/getWaterInfo")
	public ModelAndView getWaterInfo(String userCode){
		logger.info("getWaterInfo start");
		logger.info("userCode:"+userCode);
		
		return new ModelAndView("index");
	}

}
